import { SystemSetting } from '@/config'
import useUserStore from '@/store/modules/user'

/**
 * 验证用户是否具备某权限
 * @param {String|Array} value 权限标识字符串或数组
 * @returns {Boolean}
 */
export function checkPerm(value) {
  if (Array.isArray(value)) return hasPermiOr(value)
  return hasPermi(value)
}

/**
 * 验证用户是否具备某角色
 * @param {String|Array} value 角色字符串或数组
 * @returns {Boolean}
 */
export function checkRole(value) {
  if (Array.isArray(value)) return hasRoleOr(value)
  return hasRole(value)
}

/**
 * 验证用户是否具备某权限
 * @param {String} permission 权限标识字符串
 * @returns {Boolean}
 */
export function hasPermi(permission) {
  return authPermission(permission)
}

/**
 * 验证用户是否具备某权限，只需包含其中一个
 * @param {Array} permissions 权限标识数组
 * @returns {Boolean}
 */
export function hasPermiOr(permissions) {
  return permissions.some(item => {
    return authPermission(item)
  })
}

/**
 * 验证用户是否具备某权限，必须全部拥有
 * @param {Array} permissions 权限标识数组
 * @returns {Boolean}
 */
export function hasPermiAnd(permissions) {
  return permissions.every(item => {
    return authPermission(item)
  })
}

/**
 * 验证用户是否具备某角色
 * @param {String} roles 权限标识字符串
 * @returns {Boolean}
 */
export function hasRole(role) {
  return authRole(role)
}

/**
 * 验证用户是否含有指定角色，只需包含其中一个
 * @param {Array} roles 权限标识数组
 * @returns {Boolean}
 */
export function hasRoleOr(roles) {
  return roles.some(item => {
    return authRole(item)
  })
}

/**
 * 验证用户是否含有指定角色，必须全部拥有
 * @param {Array} roles 权限标识数组
 * @returns {Boolean}
 */
export function hasRoleAnd(roles) {
  return roles.every(item => {
    return authRole(item)
  })
}

/**
 * 操作权限校验
 * @param {String} permission 权限标识
 * @returns {Boolean}
 */
export function authPermission(permission) {
  const all_permission = SystemSetting.ALL_PERMISSION
  const permissions = useUserStore().permissions
  if (permission && permission.length > 0) {
    return permissions.some(v => {
      return all_permission === v || v === permission
    })
  } else {
    return false
  }
}

/**
 * 角色权限校验
 * @param {String} role 角色标识
 * @returns {Boolean}
 */
export function authRole(role) {
  const super_admin = SystemSetting.SUPER_ADMIN_ROLE
  const roles = useUserStore().roles
  if (role && role.length > 0) {
    return roles.some(v => {
      return super_admin === v || v === role
    })
  } else {
    return false
  }
}
